perm filename BASE[KID,KMC] blob
sn#111190 filedate 1974-11-15 generic text, type T, neo UTF8
TITLE BASE
;MAIN ROUTINE FOR MOST OF THE NEW KIDS SUITE PROGRAMS.
;TO CHANGE NUMBER OF BUFFERS CHANGE VALUES OF
; BLKSIZ - NUMBER OF BLOCKS I/P FROM DISK AT A TIME
; BUF - BUFFER SPACE
EXTERNAL GAMNAM, DOTHNG, DIRECT,GAMENO
INTERNAL MAINLP, TIKCNT
INTERNAL DPINIT, CLEAR, PDPGET, SHOW, KILL, DDRREL
INTERNAL CHINIT, AIVECT, LV2, TYOPTR, DMDDIR, SPEAK
INTERNAL HSINIT, CHRSAV, NEWBLK, CLRBUF, NAMSAV
INTERNAL DRCTRY,HSTBLK,COMBLK,OUTDIR;
X1←6
X2 ← X1+1
X3 ← X2+1
X4 ← X3+1
X5 ← X4+1
X6 ← X5+1
P←17
A←13 ;SAME AS X6
B←14
C←15
HSTCHN←11
TIKCNT: 0 ;COUNTS TICKS OF TIME.
PDL: BLOCK 21
INISH: ;INITIALISE
MOVE P,[IOWD 20,PDL]
PUSHJ P,HSINIT ;INITIALIZE HISTORY FILE
MOVEI A,-=352
MOVEI B,=2561
PUSHJ P,DPINIT ;DPINIT(-352,2561)
MOVEI A,-=512
MOVEI B,=512
PUSHJ P,AIVECT ;AIVECT(-512,512)
MOVEI A,0
PUSHJ P,SHOW ;SHOW(0)
MOVEI A,2
MOVEI B,=69
MOVEI C,-=512
PUSHJ P,CHINIT ;CHINIT(2,69,-512)
PUSHJ P,CLEAR
MOVEI A,-=570
MOVEI B,=2561
PUSHJ P,DPINIT ;DPINIT(-570,2561)
MOVE A,GAMNAM
JUMPE A,.+2 ;SKIP IF NO PIX REQUIRED.
PUSHJ P,DDRGET ;READ DIRECTORY
SPCWAR 1,SWJOB
JUMPE A,MAINLP
MOVEI A,0
MOVEI B,=2561
PUSHJ P,DPINIT ;DPINIT(0,2561)
HALT
SWJOB: SOS TIKCNT ;DECREMENT ANY WAITING TIME
CALL [SIXBIT /DISMIS/] ;NULL SPACE WAR JOB
MAINLP: MOVEI 0 ;READ NEXT CHARACTER AND EXEC APPROP SEQ
PUSHJ P,CLRBUF ;RECORD ANYTHING THAT WAS TYPED
CALL [SIXBIT /SLEEP/];SLEEP FOR 0 SECONDS
TTYUUO 11, ;CLRBFI - CLEAR TYPE-AHEAD
CLRBFO ;CLEAR TTY BUFFER
CALL [SIXBIT /SLEEP/];SLEEP FOR 0 SECONDS
MOVEI X1,=200 ;TEMP FOR 200
MOVEM X1,TIKCNT ;WILL WAIT 3 SECONDS FOR A CHAR.
GROGGY: INCHRS X1 ;NEXT CHAR IF NOW TYPED
JRST .+2
JRST CHRFND ;NEW CHARACTER FOUND.
CALL [SIXBIT /SLEEP/];WAIT A WHILE
CAMG 0,TIKCNT
JRST GROGGY
SPCWAR 636367 ;KILL SPACE WARWHEN TIME RUNS OUT.
PUSHJ P,OUTHIS ;UPDATE HISTORY FILE
INCHRW X1 ;WAIT FOR AND READ 1 CHARACTER.
SPCWAR 1,SWJOB
CHRFND: SETZM TIKCNT
ANDI X1,177 ;CHUCK CNTRL BUTTON INFO
CAIN X1,044 ;TEST FOR DOLLAR
JRST GAMCHG ;END OF THIS GAME ANOTHER FOLLOWS
MOVEI A,1
PUSHJ P,KILL ;CLEAR P.O.G. 1
MOVEI A,2
PUSHJ P,KILL ;CLEAR P.O.G. 2
MOVEI A,3
PUSHJ P,KILL ;CLEAR P.O.G. 3
CAIL X1,140 ;TEST FOR LOWER CASE ALPHABET
SUBI X1,040 ;RECODE SO BOTH CASES ARE SAME
PUSHJ P,CHRSAV ;SAVE CHARACTER IN HISTORY BUFFER
JRST DOTHNG ;DO THIS GAME'S THING.
GAMCHG: SPCWAR 636367 ;KILL SPACEWAR JOB.
PUSHJ P,HISREL ;UPDATE HIST FILE & RELEASE CHANNEL
MOVEI A,0
MOVEI B,=2561
PUSHJ P,DPINIT ;DPINIT(0,2561)
GAMCH2: INCHRW X1 ;GET NEXT CHARACTER
CAIGE X1,060 ;COMPARE TO ZERO
JRST GAMCH2 ;TRY ANOTHER CHARACTER.
CAILE X1,132 ;COMPARE TO LETTER Z
JRST GAMCHG+1 ;TRY NEXT CHARACTER.
;IF CONTROL FALLS THRU THEN CHARACTER IS BETWEEN 0 AND Z.
SUBI X1,040 ;CONVERT TO SIXBIT CODING
LSH X1,6
ORM X1,JNAME ;PUT DIGIT INTO GAME NAME
PUSHJ P,DDRREL ;RELEASE CHANNEL
PTWRS7 NAMADR ;PLACE NAME OF HISTORY FILE IN TTY BUFFER
MOVEI 0,NEWJOB
CALL 0,[SIXBIT /SWAP/]
NEWJOB: SIXBIT /DSK/
JNAME: SIXBIT /GAME/
SIXBIT /DMP/ ;NO MODE BITS
XWD 0,0 ;GAMES WILL BE (NOK)K PROGRAMS
0 ;ZERO AS PROJECT-PROGRAMMER NAME
;STOLEN LISP DISPLAY PRIMITIVES
COMMENT ⊗
THESE ARE SOME VALUES THAT THE DISPLAY ROUTINES MAY RETURN
(OTHER THAN 0) THAT INDICATE ERROR CONDITIONS:
1 DISPLAY BUFFER OVERFLOW
2 SCREWED UP FILE NAME FROM LISP
3 CAN'T INIT DISK (OOPS)
4 CAN'T FIND DISPLAY FILE
5 CAN'T FIND DISPLAY SUBFILE
⊗
OPDEF DPYPOS [XWD 702100,0]
OPDEF DPYSIZ [XWD 702140,0]
OPDEF DPYCLR [XWD 701000,0]
OPDEF UPG [XWD 703000,0]
TYOD: 1
CHCT: 1
LINL: 20
BSIZ←=1000
RV←←6
AV←←106
VIS←←0
EP←←20
INV←←40
DSK←←12 ;DSK I/O CHANNEL NO.
SVS←100
SV←2
PAGE
GVECT: DPB C+1,[POINT 3,C,27]
DPB C+2,[POINT 3,C,24]
JRST LV
AIVECT: MOVEI C,INV+AV
JRST LV
AVECT: MOVEI C,VIS+AV
JRST LV
APT: MOVEI C,EP+AV
LV: DPB A,[POINT 11,C,10]
DPB B,[POINT 11,C,21]
LV2: AOS A,TYOPTR
MOVEM C,(A)
LV3: HRLI A,(<POINT 7,0,35>)
MOVEM A,TYOPTR#
HRRZI A,0(A)
CAIL A,BUF+BSIZ-20
JRST [MOVEI A,1
POPJ P,]
MOVEI A,0
POPJ P,
RIVECT: MOVEI C,INV+RV
JRST RVG
RVECT: MOVEI C,VIS+RV
JRST RVG
RPT: MOVEI C,EP+RV
RVG: CAIL A,-SVS
CAIL A,SVS
JRST LV
CAIL B,-SVS
CAIL B,SVS
JRST LV
ANDCMI C,RV
DPB A,[POINT 7,C,22]
DPB B,[POINT 7,C,29]
LSH C,20
ORI C,SV+INV
MOVE A,@TYOPTR
TLZ A,777774
CAIE A,(C)
JRST LV2
LSH C,-24
DPB C,[POINT 16,@TYOPTR,31]
LOCATE: HRRZ A,TYOPTR
POPJ P,
PAGE
DTYO: CAIN A,15 ;CARRIAGE RETURN
JRST EOL
CAIN A,12 ;LINEFEED
JRST DTYO3
CAIE A," " ;SPACE
CAIN A," " ;TAB
JRST SPACING
SKIPE SPFLG#
JRST DOSPNG
DTYO2: MOVEM A,LASTHP
MOVE A,LINL
SUB A,CHCT
EXCH A,LASTHP#
DTYO3: IDPB A,TYOPTR
POPJ P,
EOL: SETOM LASTHP
SETOM SPFLG
JRST DTYO3
SPACING: SETOM SPFLG
POPJ P,
DOSPNG: SETZM SPFLG
PUSH P,A
MOVE A,LINL
SUB A,CHCT
SUBI A,1
SKIPGE LASTHP
JRST INDENT
SUB A,LASTHP
CAIN A,1
JRST ONESP
DOSPN3: IMUL A,CHSIZ
DOSPN4: LSH A,31
ORI A,RV+INV
PUSH P,C
MOVE C,A
PUSHJ P,LV2
POP P,C
DOSPN2: POP P,A
JRST DTYO2
ONESP: MOVEI A," "
IDPB A,TYOPTR
JRST DOSPN2
INDENT: SKIPE DPLM
JRST INDNT2
JUMPE A,DOSPN2
CAIN A,1
JRST ONESP
INDNT2: IMUL A,CHSIZ
ADD A,DPLM
JRST DOSPN4
DJUMP: HRLZI C,0(A)
ORI C,1B31
JRST LV2
DJSR: HRLZI C,0(A)
ORI C,24
JRST LV2
FIXUP: HRLM B,0(A)
POPJ P,
DTYOS: MOVE A,[JRST DTYO]
EXCH A,TYOD
MOVEM A,DTYOO#
MOVE A,DPHPOS#
EXCH A,CHCT
MOVEM A,CCSAV#
MOVE A,DPLL
EXCH A,LINL
MOVEM A,LLSAV#
JRST FALSE
DTYOU: MOVE A,DTYOO
MOVEM A,TYOD
MOVE A,CCSAV
EXCH A,CHCT
MOVEM A,DPHPOS
MOVE A,LLSAV
EXCH A,LINL
MOVEM A,DPLL
JRST FALSE
CHINIT: ADDI C,1000
MOVE A,RESTAB(A) ;CHARACTER WIDTH
MOVEM A,CHSIZ#
MOVEM C,DPLM# ;LEFT MARGIN
MOVEM B,DPLL# ;LINELENGTH
JRST FALSE
RESTAB←.-1
10
14
16
20
30
40
60
PAGE
SHOW: MOVE B,TYOPTR
SUBI B,BUF-2
HRRZM B,BUFHD+1
SH2: DPB A,[POINT 4,SH1,12]
SH1: UPG BUFHD
FALSE: MOVEI A,0
POPJ P,
DPINIT: DPYSIZ 0(B)
DPYPOS 0(A)
CLEAR: MOVEI A,1
MOVEM A,BUF
MOVE A,[XWD BUF,BUF+1]
BLT A,BUF+BSIZ-1
MOVEI A,BUF-1
JRST LV3
KILL: SETZM BUFHD+1
JRST SH2
IO←A
COMMENT ⊗
DPGET TAKES THE PNAME OF A DPY FILENAME AS ITS ONLY
ARGUMENT. IT INPUTS THE FILE INTO THE DPY BUFFER.
⊗
DPGET: MOVEI C,1 ;ZERO THE BUFFER
MOVEM C,BUF
MOVE C,[XWD BUF,BUF+1]
BLT C,BUF+BSIZ-1
MOVEM A,FILE
PUSHJ P,DPNT ;DO INIT
PUSHJ P,LOOK ;DO LOOKUP
DPINP1: INPUT DSK,[IOWD 2,BUFHD
0]
MOVE A,BUFHD+1
ADDI A,2
MOVN A,A ;GET -(WORD COUNT)
HRLM A,BUFCOM ;SET UP COMMAND
USETI DSK,1 ;START AT THE BEGINNING
DPINP2: INPUT DSK,BUFCOM ;GET BUFFER
RELEASE DSK,0
BUFFIX: MOVEI A,BUF-1 ;RESTORE BUFFER POINTER
MOVEM A,BUFHD
MOVE A,BUFHD+1
MOVEI B,1
MOVEM B,BUF-2(A)
MOVEI A,BUF-3(A) ;READY FOR BYTE POINTER IN A
JRST LV3
DPPUT: POPJ P,
DPNT: INIT DSK,17 ;INIT BIN MODE
SIXBIT/DSK/
XWD DSKO,DSKI
JRST [MOVEI A,3
POP P,
POPJ P,]
MOVEI A,0
POPJ P,
LOOK: SETZM FILE+2
SETZM FILE+3
DPLKUP: LOOKUP DSK,FILE
JRST [MOVEI A,4
POP P,
POPJ P,]
MOVEI A,0
POPJ P,
COMMENT ⊗
THIS SECTION CONTAINS SUBRS DDRGET, DDRREL, AND PDPGET.
PDPGET (FOR "PACKED DPGET") PERFORMS THE SAME FUNCTION AS DPGET,
EXCEPT THAT A PACKED DPY FILE IS ASSUMED TO HAVE BEEN LOOKED UP,
THAT ITS DIRECTORY HAS BEEN READ, AND THAT THE "FILE" REFERRED TO
BY THE PDPGET CALL IS IN THE PACKED DPY FILE. THESE INITIALIZATION
FUNCTIONS ARE ALL PERFORMED BY DDRGET, WHICH TAKES THE PNAME OF
THE FILENAME OF A PACKED DPY FILE AS ITS ONLY ARGUMENT. BETWEEN
CALLS ON DDRGET, THE ARGUMENTLESS SUBR DDRREL MUST BE CALLED.
⊗
DDRGET: MOVEM A,FILE ;GET SIXBIT OF PACKED DPY FILE
PUSHJ P,DPNT ;INIT DSK AND LOOKUP FILE
PUSHJ P,LOOK
INPUT DSK,[IOWD 1,DIRECT↔0] ;GET NUMBER OF SUB-FILES
MOVE A,DIRECT ;MAKE NUMBER OF DIRECTORY WORDS
IMULI A,2
ADDI A,1
MOVN A,A ;MAKE IOWD
HRLM A,DIRCOM
USETI DSK,1 ;GET BACK TO BEGINNING OF FILE
INPUT DSK,DIRCOM ;GET THE WHOLE DIRECTORY
MOVE A,DIRECT ;MAKE ADDRESS OF LAST RECORD NO.
IMULI A,2
ADDI A,DIRECT
MOVEM A,DIRECT ;PUT IT WHERE WE CAN FIND IT
MOVEI A,0
POPJ P,
DDRREL: RELEASE DSK,0 ;RELEASE DSK CHANNEL
POPJ P,
PDPGET: MOVEM A,FILE ;GET SIXBIT INTO A
MOVE A,FILE
MOVEI B,DIRECT+1 ;POINT TO 1ST FILE NAME
FSLOOP: CAMN A,(B) ;HAVE WE A MATCH?
JRST MATCH ;YES
ADDI B,2 ;NO, TRY NEXT ONE
CAMG B,DIRECT ;TOO FAR?
JRST FSLOOP ;NO
MOVEI A,5
POPJ P,
MATCH: USETI DSK,@1(B) ;GET THE RECORD INDICATED
INPUT DSK,[IOWD 200,BUFHD↔0] ;GET 1ST RECORD
MOVE A,BUFHD+1 ;GET SIZE OF BUFFER
MOVEI B,BUFHD ;INITIALIZE INPUT LOCATION
MULREC: CAIG A,200 ;ANY MORE RECORDS?
JRST BUFFIX ;NO, WE ARE DONE
SUBI A,200
ADDI B,200
HRRM B,MRCOM
INPUT DSK,MRCOM ;GET ANOTHER RECORD
JRST MULREC
DSKI: BLOCK 3
DSKO: BLOCK 3
FILE: 0↔SIXBIT/DPY/↔0↔0
DIRCOM: IOWD 0,DIRECT↔0
MRCOM: IOWD 200,0↔0
BUFCOM: IOWD 2,BUFHD
0
VAR
LIT
BUFHD: BUF-1
0
0 ;LOCATION FOR DPY JSR
BUF: BLOCK =4674
ADCHN ←← 16 ;channel for A/D output.
DSKCHN ←← 17 ;channel for reading in sound files.
BLKSIZ ←← 1 ;NUMBER OF BLOCKS INPUT FROM UDP AT A TIME.
UBUFSZ ←← BLKSIZ*=2336 ;BUFFER SIZE IF READING UDP.
DBUFSZ ←← BLKSIZ*=2304 ;BUFFER SIZE IF READING FROM SYSTEM.
BUF1 ← BUF
BUF2 ← BUF+UBUFSZ+1 ;NOTE UBUFSZ > DBUFSZ.
PAKST←←1
DMDDIR: ;FIRST INIT A2D IF POSSIBLE.
SETOM NITFLG ;EXPECT TO INIT A2D
INIT ADCHN,517 ;INIT AD IN DUMP MODE.
SIXBIT/AD/
0
SETZM NITFLG ;INDICATE FAILURE.
;LOCATE FILE ON UDP OR DSK.
MOVE B,[SIXBIT /UDP/]
CALL B,[SIXBIT /DEVCHR/]
TRON B,400000 ;SKIP IF BIT 18 IS ONE
JRST ASSDSK ;UDP IS NOT ASSIGNED BY ANYONE
;(IN PARTICULAR NOT BY THIS JOB).
TLON B,40 ;SKIP IF BIT 12 IS ON
JRST ASSDSK ;UDP IS ASSIGNED TO SOMEONE ELSE.
SETOM USEUDP ;HOPE THIS STICKS INDICATING FILE WAS
;FOUND IN UDP DIRECTORY.
MOVEI B,UBUFSZ
MOVEM B,BUFSZ ;SET THE BUFFER SIZE VARIABLE.
INIT DSKCHN,117 ;INIT THE UDP IN DUMP MODE.
SIXBIT /UDP/
0
JRST ASSDSK ;UDP DOWN - TRY SYSTEM FILES.
MOVEI B,BLKSIZ ;NO. OF UDP BLOCKS READ AT ATIME
MOVEM B,BLKINC ;THIS IS THE INC FOR EACH READ ORDER
JRST START
ASSDSK: INIT DSKCHN,17 ;INIT THE DSK IN DUMP MODE.
SIXBIT /DSK/
0
JRST [MOVEI A,1 ;BOTH DSK AND UDP OUT.
SKIPE NITFLG ;SKIP IF A2D NOT INITED
RELEAS ADCHN,
POPJ P,]
SETZM USEUDP ;SIGNIFY FILE IS ON DSK.
MOVEI B,DBUFSZ
MOVEM B,BUFSZ ;SET APPROPRIATE BUFFER SIZE.
SETZM BLKINC ;NO REFERENCE TO BLOCKS IN SYSTEM FILES
START: MOVEM A,SFILE
MOVEM A,SFILEB
MOVE B,[SIXBIT/DMD/] ;YES.
MOVEM B,SFILE+1 ;SAVE THE EXTENSION IN THE SECOND WORD.
MOVEM B,SFILEB+1 ;SAVE THE EXTENSION IN THE SECOND WORD.
SETZM SFILE+2 ;ZERO THE THIRD WORD OF THE FILE INFO.
SETZM SFILEB+2 ;ZERO THE THIRD WORD OF THE FILE INFO.
MOVE B,[SIXBIT/ 1KMC/];ALWAYS ASSUME 1,KMC PPN.
MOVEM B,SFILE+3 ;SAVE THE PPN IN THE FOURTH WORD.
MOVE B,[SIXBIT/ 3KMC/];OR PERHAPS 3,KMC PPN.
MOVEM B,SFILEB+3 ;SAVE THE PPN IN THE FOURTH WORD.
SKIPE USEUDP ;ARE WE USING THE UDP?
JRST UFIND ;USEUDP≠0 => YES.
LOOKUP DSKCHN,SFILE ;OTHERWISE THE DSK.
JRST .+2
JRST WOW
LOOKUP DSKCHN,SFILEB
JRST [MOVEI A,3 ;CAN'T FIND THE FILE.
RELEASE DSKCHN,
SKIPE NITFLG ;SKIP IF A2D NOT INITED
RELEAS ADCHN,
POPJ P,]
WOW: SETZM BLKNO ;NO BLOCK NUMBER FOR SYSTEM DISK
INPUT DSKCHN,[IOWD 200,BUF
0]
MOVE A,BUF ;SOUND LENGTH
SUBI A,200 ;SUBTRACT 200 FOR JUNK AT FRONT
MOVEM A,FILTH ;SAVE IT MATE.
MOVEI A,0
POPJ P,
;FIND THE FILE ON THE UDP.
UFIND: ;START BY READING THE UDP DIRECTORY WHICH IS CONTAINED IN THE
;BLOCK OF THE UDP GIVEN BY PAKST.
INPUT DSKCHN,[IOWD =2336,BUF
PAKST]
;THE FIRST UDP WORD IS THE NO. OF DEIRECTORY ENTRIES.
;THE SECOND WORD IS THE LAST ALTERATION DATE.
;THE THIRD WORD IS THE NEXT FREE UDP BLOCK.
MOVEI B,BUF+2
MOVE A,BUF ;THE DIRECTORY LOOKUP LOOP COUNT.
LSH A,1 ;TWO WORDS PER ENTRY
ADD A,B ;ADDRESS OF TOP ENTRY
FIND1: CAMN A,B
JRST FINDF ;ESCAPE WHEN NO MORE ENTRIES LEFT
MOVE C,SFILE
CAMN C,0(A) ;FILE NAMES = ?.
JRST FINDX ;SUCCESS
SUBI A,2 ;MOVE POINTER
JRST FIND1 ;TRY NEXT ENTRY.
FINDF: ;FILE NOT FOUND IN DIRECTORY OF UDP.
MOVE A,SFILE ;GET FILE NAME.
RELEAS DSKCHN,
SETZM USEUDP
JRST ASSDSK
FINDX: HLR B,1(A) ;FILE LENGTH
MOVEM B,FILTH
HRRZ B,1(A) ;STARTING BLOCK NUMBER.
MOVEM B,BLKNO
MOVEI A,0 ;DECLARE VICTORY
POPJ P, ;AND GET OUT.
;SAY THE FILE WHICH WAS SELECTED BY ROUTINE DMDDIR
;IN EITHER CASE THE APPROPRIATE DEVICE HAS BEEN INIT-ED
;AND IF THAT IS THE SYSTEM DISK THE 1ST 200 WORDS HAVE
;CHUCKED. (THESE 200 WORDS DON'T APPEAR IN UDP FILES)
RET←←C
SPEAK: ;IF A2D IS NOT INITED THEN DO IT TO IT.
MOVE A,NITFLG
JUMPN A,SPLOOP ;JUMP IF NITFLG=-1
INIT ADCHN,517 ;INIT AD IN DUMP MODE.
SIXBIT/AD/
0
JRST SPEAK ;A2D NOT AVAILABLE.
SETOM NITFLG
;THE FOLLOWING CODE WAS BORROWED FROM 1,LCS.
SPLOOP: JSP RET,RWSUB ;READ AND WRITE
BUF1-1
JUMPLE B,SPEAKX ;QUIT IF THAT WAS LAST XFER.
JSP RET,RWSUB ;READ/WRITE USING BUF2
BUF2-1
JUMPLE B,SPEAKX ;QUIT IF THAT WAS LAST XFER.
JRST SPLOOP
SPEAKX: ;THE SOUND HAS BEEN SOUNDED.
RELEAS ADCHN, ;FINISHED WITH D TO A CVTR.
RELEAS DSKCHN, ;FINISHED WITH THIS CHANNEL
SETZM NITFLG ;INDICATE OTHER CRUMBS MAY USE A2D.
MOVEI A,0
POPJ P,
RWSUB: ;THE READ/WRITE SUBROUTINE USED TWICE ABOVE.
; 0(RET) GIVES THE BUFFER ADDRESS.
; 1(RET) GIVES THE NEXT INSTRUCTION.
; ON EXIT B WILL BE THE NUMBER OF WORDS YET TO BE PLAYED.
MOVE B,FILTH ;NO. OF WORDS TO BE PLAYED.
SUB B,BUFSZ ;SUBTRACT TRANSFER LENGTH
MOVEM B,FILTH
MOVN A,BUFSZ ;WILL COMPUTE -XFER LENGTH IN A
JUMPG B,.+2 ;SKIP UNLESS LAST TIME.
SUB A,B ;-BUFSZ - (XFER LTH - BUFSZ)
LSH A,=18 ;MOVE TO TOP HALF OF WORD.
HRR A,0(RET) ;INSERT START ADDRESS.
MOVEM A,INCMD
MOVEM A,OUTCMD
INPUT DSKCHN,INCMD ;READ TO BUFFER
MOVE A,BLKINC ;BLOCK COUNT INCREMENT.
ADDM A,BLKNO
OUTPUT ADCHN,OUTCMD ;SPEAK NEXT BUFFER.
JRST 1(RET) ;GET OUT OF S/R
SFILE: 0 ;WILL BE A FILE NAME
SIXBIT /DMD/
0
SIXBIT / 1KMC/
SFILEB: 0
SIXBIT /DMD/
0
SIXBIT / 3KMC/
INCMD: 0 ;WILL BE AND INPUT IOWD.
BLKNO: 0 ;WILL BE THE SOURCE BLOCK NO FOR UDP INPUT.
0
FILTH: 0 ;WILL BE THE FILE LENGTH OF SOUND INFO
NITFLG: 0 ;INDICATES, IF NONZERO, A2D IS INITED.
USEUDP: 0 ;ZERO INDICATES SYSTEM DISK,
BLKINC: 0 ;INCREMENT FOR BLKNO
OUTCMD: 0 ;SET UP IN S/R RWSUB
3650 ;MAGIC BITS FOR 136
OUTBIT: 4010
0
0
BUFSZ: 0
; THIS SECTION CONTAINS ROUTINES TO MANAGE THE HISTORY FILE
HSINIT: OUTSTR [ASCIZ /NAME (VISITORS JUST TYPE <RETURN>):/]
MOVEI X1,0 ;CLEAR AC
MOVEI X2,0
MOVEI X3,0
MOVEI X4,7 ;ALLOW FROM 1 TO 6 CHARACTERS
NAMEIN: INCHRW X1 ;GET A CHARACTER
CAIN X1,040 ;IF IT IS BLANK,
JRST ,NAMEIN ; IGNORE IT
CAIL X1,140 ;TEST FOR LOWER CASE ALPHABET
SUBI X1,040 ;RECODE SO BOTH CASES ARE SAME
LSH X1,1 ;SHIFT CHARACTER LEFT A BIT
ORM X1,NAMSAV(X2) ;SAVE CHARACTER FOR USE WHEN CHANGING GAMES
LSH X1,=-1 ;SHIFT CHARACTER BACK INTO PLACE
AOJ X2, ;BUMP SAVE POINTER
SUBI X1,040 ;CONVERT TO SIXBIT
NONBL: JUMPL X1,GOTNAM ;IF ITS A CARRIAGE RETURN, NAME IS IN
LSH X3,6 ;MAKE ROOMN FOR NEW CHARACTER
ORM X1,X3 ;INSERT IT
SOJ X4, ;COUNT IT
JRST ,NAMEIN ;GO GET ANOTHER
GOTNAM: CAIE X4,7 ;IF A FILE WAS SPECIFIED,
JRST ,JUSNAM ; GO PROCESS IT
MOVE X2,POPOUT ;IF NO FILE SPECIFIED, ZAP HISTORY ROUTINES
MOVEM X2,CHRSAV
MOVEM X2,CLRBUF
MOVEM X2,HISREL
MOVEM X2,OUTHIS
POPJ P, ; AND RETURN
JUSNAM: SOJLE X4,SAVNAM ;IF FILE NAME IS LEFT-ADJUSTED, GO SAVE IT
LSH X3,6 ; ELSE SHIFT IT LEFT ONE CHARACTER
JRST JUSNAM ; AND GO TEST AGAIN
SAVNAM: MOVEM X3,FILNM1
MOVEM X3,FILNM2
INIT HSTCHN,17 ;INITIALIZE IN DUMP MODE
SIXBIT /DSK/
XWD 0,0
JRST BADOPN ;ERROR TRAP
LOOKUP HSTCHN,FILNM1
JRST NOFILE
ENTER HSTCHN,FILNM2
JRST .+1 ; EXPECT FILE TO EXIST
CALL X1,[SIXBIT/DATE/]
MOVEM X1,TODAY
CLRBFI ;CLEAR TTY BUFFER
USETI HSTCHN,1 ;POINT TO DIRECTORY
IN HSTCHN,IODIR ;READ IN DIRECTORY
PUSHJ P,NEWBLK ;START A NEW BLOCK
POPOUT: POPJ P, ; AND RETURN
CHRSAV: CALL X5,[SIXBIT/TIMER/] ;GET TIME OF DAY
CHRSV2: HRRZ X2,HSTBLK ;GET LOCATION OF LAST ENTRY
CAIGE X2,177 ;TEST IF IT IS END-OF-BLOCK
JRST SAMBLK ; IF NOT, GO ADD AN ENTRY
PUSHJ P,COMBLK ; ELSE WRITE BLK & INDICATE ITS COMPLETE
PUSHJ P,NEWBLK ;GO SET UP NEW BLOCK
MOVEI X2,0 ;POINT TO START OF NEW BLOCK
SAMBLK: AOJ X2, ;POINT TO NEXT ENTRY
HRRM X2,HSTBLK ;SAVE IT
OR X5,GAMENO ;BUILD
ROT X1,=-7 ; NEW
OR X5,X1 ; ENTRY
MOVEI 8,HSTBLK ;POINT TO HISTORY BLOCK
MOVEM X5,@HSTBLK ;STORE NEW ENTRY
ROT X1,7 ;RESTORE CHARACTER
POPJ P, ;AND RETURN
NEWBLK: MOVEI 8,DRCTRY ;POINT TO DIRECTORY
HRRZ X2,DRCTRY ;GET LOCATION OF LAST BLOCK ENTRY
AOJ X2, ;POINT TO NEXT BLOCK ENTRY
HRRM X2,DRCTRY ;SAVE IT
AOJ X2, ;GET DISK ADDRESS
HRRM X2,COMBLK ;SET UP USETO INST. TO POINT TO NEW BLOCK
HRRM X2,OUTHIS ;SET UP USETO INST. TO POINT TO NEW BLOCK
MOVE X2,TODAY ;INITIALIZE
MOVEM X2,@DRCTRY ; BLOCK ENTRY
PUSHJ P,OUTDIR ;WRITE OUT DIRECTORY
HLLZS HSTBLK ;CLEAR WORD COUNT IN NEW BLOCK
POPJ P, ;RETURN
COMBLK: USETO HSTCHN,0 ;SET TO COMPLETED BLOCK
OUT HSTCHN,IOHIS ;WRITE OUT COMPLETED BLOCK
MOVEI 8,DRCTRY ;POINT TO BLOCK ENTRY
HRLZI X2,400000 ;PLACE BLOCK-COMPLETED-INDICATOR
ORM X2,@DRCTRY ; IN DIRECTORY
POPJ P, ;AND RETURN
OUTHIS: USETO HSTCHN,0 ;SET TO CURRENT BLOCK
OUT HSTCHN,IOHIS ;WRITE OUT HISTORY BLOCK
POPJ P, ; AND RETURN
OUTDIR: USETO HSTCHN,1 ;OUTPUT
OUT HSTCHN,IODIR ; DIRECTORY
POPJ P, ; AND RETURN
CLRBUF: INCHRS X1
POPJ P, ;RETURN WHEN NO CHARACTERS LEFT
CALL X5,[SIXBIT/TIMER/] ;GET TIME OF DAY
OR X5,NOTRES ;INDICATE CHARACTER NOT RESPONDED TO
PUSHJ P,CHRSV2 ;SAVE THE CHARACTER
JRST CLRBUF ;CYCLE WHILE CHARACTERS ARE LEFT
HISREL: PUSHJ P,COMBLK ;UPDATE HIST FILE & INDICATE BLOCK COMPLETED
PUSHJ P,OUTDIR ;WRITE OUT UPDATED DIRECTORY BLOCK
RELEAS HSTCHN,0 ;RELEASE HISTORY CHANNEL
POPJ P, ;AND RETURN
BADOPN: OUTSTR [ASCIZ/CHANNEL UNAVAILABLE/]
NOFILE: OUTSTR [ASCIZ/HST FILE MISSING/]
CALL [SIXBIT/EXIT/]
IODIR: IOWD 200,DRCTRY
0
IOHIS: IOWD 200,HSTBLK
0
DRCTRY: BLOCK 200
HSTBLK: 000010000000 ;INDIRECT ADRESSING USING REG. 8
BLOCK 177
FILNM1: XWD 0,0 ;SLOT FOR FILE NAME
SIXBIT /HST/ ; EXTENSION IS HST
XWD 0,0
SIXBIT / 1KMC/ ;PROJECT-PROGRAMMER IS 1,KMC
FILNM2: XWD 0,0 ;SLOT FOR FILE NAME
SIXBIT /HST/ ; EXTENSION IS HST
XWD 0,0
SIXBIT / 1KMC/ ;PROJECT-PROGRAMMER IS 1,KMC
TODAY: XWD 0,0 ;SLOTFOR TODAYS DATE
NOTRES: 002000000000 ;FLAG FOR FLUSHED CHARACTERS
NAMADR: 0
.+1
NAMSAV: 201004020000 ;4 LEADING BLANKS, FIFTH CHAR IS NUL
201004020000
201004020000
201004020000
201004020000
201004020000
0
END INISH